// promise.all 方法

const fs = require('fs');

function readFile(path, isSetErr) {
  return new Promise((resolve, reject) => {    
    fs.readFile(path, 'utf8', (err, data) => {
      if (err || isSetErr)
        reject('请求失败!');
    
      const resData = JSON.parse(data);

      resolve(resData);
    })
  })
}

// readFile('./data/user.json').then(res => {
//   console.log(res);
//   // return new Promise((resolve, reject) => { resolve('成功了') })
//   // return Promise.resolve('成功了')
//   return Promise.reject('失败了')
// })
// .then(res => {
//   console.log(res);
// }, err => {
//   console.log('then:', err)
// })
// .catch(err => {
//   console.log('catch', err);
// })

/**
 * Promise.resolve() 和 Promise.reject 都是语法糖
 * 相当于 new Promise((resolve, reject) => { resolve('成功了') })
 */

// readFile('./data/user.json').then(res => {
//   console.log(res);
// })

// readFile('./data/course.json').then(res => {
//   console.log(res);
// })

// readFile('./data/userCourse.json').then(res => {
//   console.log(res);
// })

// 需求: 合并三个文件内部的内容为一个数组 并且 按照顺序排列
//       如果一个读取失败，让这个数据集合返回一个 rejected

// Promise.all 接收一个 interable类型的数据 -> Array Set Map
Promise.all([
  readFile('./data/user.json'),
  readFile('./data/course.json', true),
  readFile('./data/userCourse.json')
  // 0,
  // '123',
  // true
])
.then(res => {
  console.log(res);
})
.catch(err => {
  console.log(err);
})

/**
 * 1. 用多个异步任务并发运行，其结果创建承诺之后使用，等待所有任务结果的完成
 * 
 * 2. interable内部元素传递的是promise对象集合，如果不是promise 直接resolve
 * Promise.resolve(0 || '123', true)
 * 
 * 3. interable内部如果没有元素，返回一个空数组
 * 
 * 4. 如果有一个promise是 rejected 那么整个实例的回调就是 rejected
 * 
 * 5. 返回的rejected 是 第一个promise 出现rejected的返回的rejected结果
 */